Security News
New Python Packaging Proposal Aims to Solve Phantom Dependency Problem with SBOMs
PEP 770 proposes adding SBOM support to Python packages to improve transparency and catch hidden non-Python dependencies that security tools often miss.
pino-http is an HTTP logger middleware for Node.js that integrates with the Pino logging library. It provides high-performance logging for HTTP requests and responses, making it suitable for production environments where speed and efficiency are critical.
Basic HTTP Logging
This code sets up a basic HTTP server with pino-http middleware to log incoming requests and outgoing responses.
const http = require('http');
const pino = require('pino');
const pinoHttp = require('pino-http');
const logger = pino();
const httpLogger = pinoHttp({ logger });
const server = http.createServer((req, res) => {
httpLogger(req, res);
res.end('hello world');
});
server.listen(3000);
Custom Log Levels
This code demonstrates how to set custom log levels for the pino-http logger.
const http = require('http');
const pino = require('pino');
const pinoHttp = require('pino-http');
const logger = pino({ level: 'debug' });
const httpLogger = pinoHttp({ logger });
const server = http.createServer((req, res) => {
httpLogger(req, res);
res.end('hello world');
});
server.listen(3000);
Custom Log Formatting
This code shows how to customize the log output format using Pino's prettyPrint options.
const http = require('http');
const pino = require('pino');
const pinoHttp = require('pino-http');
const logger = pino({
prettyPrint: {
colorize: true,
translateTime: 'SYS:standard',
ignore: 'pid,hostname'
}
});
const httpLogger = pinoHttp({ logger });
const server = http.createServer((req, res) => {
httpLogger(req, res);
res.end('hello world');
});
server.listen(3000);
Morgan is another HTTP request logger middleware for Node.js. It is simpler and more lightweight compared to pino-http, but it does not offer the same level of performance and flexibility in terms of log formatting and custom log levels.
Winston is a versatile logging library for Node.js that can also be used for HTTP request logging. It provides more features and flexibility than pino-http, such as multiple transport layers and log levels, but it is generally slower in performance.
Bunyan is another JSON logging library for Node.js that can be used for HTTP request logging. It offers similar features to pino-http, such as high performance and structured logging, but it is not as widely adopted or actively maintained as Pino.
High-speed HTTP logger for Node.js
To our knowledge, pino-http
is the fastest HTTP logger in town.
Benchmarks log each request/response pair while returning
'hello world'
, using
autocannon with 100
connections and 10 pipelined requests.
http-ndjson
(equivalent info): 7730.73 req/sechttp-ndjson
(standard minimum info): 9522.37 req/secpino-http
: 21496 req/secpino-http
(extreme): 25770.91 req/secAll benchmarks where taken on a Macbook Pro 2013 (2.6GHZ i7, 16GB of RAM).
npm i pino-http --save
'use strict'
var http = require('http')
var server = http.createServer(handle)
var logger = require('pino-http')()
function handle (req, res) {
logger(req, res)
req.log.info('something else')
res.end('hello world')
}
server.listen(3000)
$ node example.js | pino
[2016-03-31T16:53:21.079Z] INFO (46316 on MBP-di-Matteo): something else
req: {
"id": 1,
"method": "GET",
"url": "/",
"headers": {
"host": "localhost:3000",
"user-agent": "curl/7.43.0",
"accept": "*/*"
},
"remoteAddress": "::1",
"remotePort": 64386
}
[2016-03-31T16:53:21.087Z] INFO (46316 on MBP-di-Matteo): request completed
res: {
"statusCode": 200,
"header": "HTTP/1.1 200 OK\r\nX-Powered-By: restify\r\nContent-Type: text/html; charset=utf-8\r\nContent-Length: 11\r\nETag: W/\"b-XrY7u+Ae7tCTyyK7j1rNww\"\r\nDate: Thu, 31 Mar 2016 16:53:21 GMT\r\nConnection: keep-alive\r\n\r\n"
}
responseTime: 10
req: {
"id": 1,
"method": "GET",
"url": "/",
"headers": {
"host": "localhost:3000",
"user-agent": "curl/7.43.0",
"accept": "*/*"
},
"remoteAddress": "::1",
"remotePort": 64386
}
pino-http
has the same options as pino.
pino-http
attaches listeners to the request, in order to log when the request completes
pino-http
can reuse a pino instance if passed with the logger
property
You can pass a genReqId
function which gets used to generate a request id. The first argument is the request itself.
As fallback pino-http
is just using an integer. This default might not be the desired behavior if you're running multiple instances of the app.
'use strict'
var http = require('http')
var server = http.createServer(handle)
var pino = require('pino')()
var logger = require('pino-http')({
// Reuse an existing logger instance
logger: pino,
// Define a custom request id function
genReqId: function (req) { return req.id },
// Define custom serializers
serializers: {
req: pino.stdSerializers.req,
res: pino.stdSerializers.res
}
})
function handle (req, res) {
logger(req, res)
req.log.info('something else')
res.end('hello world')
}
server.listen(3000)
Generates a JSONifiable object from the HTTP request
object passed to
the createServer
callback of Node's HTTP server.
It returns an object in the form:
{
pid: 93535,
hostname: 'your host',
level: 30,
msg: 'my request',
time: '2016-03-07T12:21:48.766Z',
v: 0,
req: {
id: 42,
method: 'GET',
url: '/',
headers: {
host: 'localhost:50201',
connection: 'close'
},
remoteAddress: '::ffff:127.0.0.1',
remotePort: 50202
}
}
Generates a JSONifiable object from the HTTP response
object passed to
the createServer
callback of Node's HTTP server.
It returns an object in the form:
{
pid: 93581,
hostname: 'myhost',
level: 30,
msg: 'my response',
time: '2016-03-07T12:23:18.041Z',
v: 0,
res: {
statusCode: 200,
header: 'HTTP/1.1 200 OK\r\nDate: Mon, 07 Mar 2016 12:23:18 GMT\r\nConnection: close\r\nContent-Length: 5\r\n\r\n'
}
}
https://www.npmjs.com/~matteo.collina
https://twitter.com/matteocollina
https://github.com/davidmarkclements
https://www.npmjs.com/~davidmarkclements
https://twitter.com/davidmarkclem
MIT
FAQs
High-speed HTTP logger for Node.js
The npm package pino-http receives a total of 494,291 weekly downloads. As such, pino-http popularity was classified as popular.
We found that pino-http demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 4 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
PEP 770 proposes adding SBOM support to Python packages to improve transparency and catch hidden non-Python dependencies that security tools often miss.
Security News
Socket CEO Feross Aboukhadijeh discusses open source security challenges, including zero-day attacks and supply chain risks, on the Cyber Security Council podcast.
Security News
Research
Socket researchers uncover how threat actors weaponize Out-of-Band Application Security Testing (OAST) techniques across the npm, PyPI, and RubyGems ecosystems to exfiltrate sensitive data.